Context switching프로세스가 바뀔 때의 메커니즘을 컨텍스트 스위칭이라고 부른다.
Process struct deep dive- text(code): 코드(컴파일된 소스코드 저장)
- data: 변수/초기화된 데이터
- stack: 임시 데이터(함수 호출, 로컬 변수)
- heap: 코드에서 동적으로 만들어지는 데이터
지역변수 stack
초기화된 전역변수, 정적변수 data
초기화 되지 않은 전역변수, 정적변수 bss // bss 영역은 코드가 실행될 때 자동으로 0으로 초기화
code, data, heap, stack
ex) c언어 compile (정확한 동작은 아님!!)
void meaningless(int data){
int temp;
temp=data;
}
int main(int arqc, char **argv){
meaningless(1);
return 0;
}
stack:return address:0006h(PC-0006h변경이후 pop6)
argc(pop5)
argv(pop4)
return address:0005h(PC-0005h변경이후 pop3)
data=1(pop2)
temp=1(pop1)
heap:
data:
code:
void meaningless(int data){ //0000h
int temp; //0001h
temp=data; //0002h
}
int main(int argc, char** argv){ //0003h
meaningless(1); //0004h
return 0; //0005h
}
//0006h - main 함수 이후 처리 코드 존재
PC(Program Counter)+SP(Stack Pointer)PC: Code에서 현재 실행중인 코드를 가르킨다.
SP: Stack에서 가장 최상단(최소)-1 주소값을 가르킨다.
EBP, EAX 레지스터와 같이 동작
(EBP는 Stack을 동작시킬 때, SP를 기록 , EBP를 현재의 SP로 덮어씌우기 전에 stack에 현재 EBP 기록)
함수의 return 값은 EAX에 저장
#include <stdio.h>
#include <stdlib.h>
int main(){
int* data;
data=(int*)malloc(sizeof(int));
*data=1;
printf("%d\n",*data);
return 0;
}
stack:ret:0006h
data=1000h
heap:
32bit(0-trash value)->1(int) //1000h-32bit의 공간이 생성
data:
code:
int main(){ //0000h
int* data; //0001h
data=(int*)malloc(sizeof(int)); //0002h-동적 메모리 할당->heap(32bit)
*data=1; //0003h
printf(“%d\n”, *data); //0004h
return 0; //0005h
}
//0006h
컴파일러가 내부적으로 만든 실행파일에서는 _start() 라이브러리 내에서 main() 함수를 호출해서 main 함수를 실행한다.main함수가 끝난후에도 프로세스 종료 처리 함수들이 존재한다.
Data segment는 BSS와 DATA로 분리BSS: 초기화 되지 않은 전역변수
DATA: 초기화된 전역변수
int global_data1;
int global_data2=1;
int main(){
int* data;
data=(int*)malloc(sizeof(int));
*data=1;
printf("%d\n", *data);
return 0;
}
참고)
스택 오버플로우: 주로 해커들의 공격에 활용되었음
void copy(char* bar)
{
char data[6];
strcpy(data, bar);
}
int main(int argc, char** argv){
copy(argv[1]);
}
위와 같이 6바이트의 data[6]에 argv로 8바이트 크기의 문자를 대입하고 이 때, 마지막 argv[1][8]을침투하고 싶은 메모리 주소로 적을 시, return 주소를 조작할 수 있다. -> 슈퍼 관리자 권한 획득을 통해 침투